메모리 보호
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
메모리 보호는 컴퓨터 시스템에서 메모리 접근을 제어하여 프로그램 간의 간섭을 방지하고 시스템의 안정성을 유지하는 기술이다. 구현 방식에는 세그먼트 방식, 페이징, 보호키, 시뮬레이트되는 세그먼트 방식, 성능 기반 번지 지정, 동적 테인팅 등이 있다. 이러한 기술들은 최소 권한의 원칙을 준수하여 메모리 보호 수준을 결정하며, x86 아키텍처를 비롯한 다양한 컴퓨터 아키텍처에서 활용된다. 대부분의 현대 운영체제는 메모리 보호 기능을 사용하며, 윈도우, 유닉스 계열 운영체제 등이 대표적이다.
더 읽어볼만한 페이지
메모리 보호 | |
---|---|
기본 정보 | |
이름 | 메모리 보호 |
유형 | 메모리 관리 기술 |
목적 | 무단 메모리 접근 방지 보안 강화 시스템 안정성 향상 |
보호 기법 | |
주요 기법 | 세그멘테이션 페이징 접근 권한 제어 (읽기, 쓰기, 실행) |
적용 대상 | |
적용 환경 | 운영 체제 하이퍼바이저 임베디드 시스템 |
중요성 | |
중요도 | 멀티태스킹 환경에서 필수적 악성 코드로부터 시스템 보호 데이터 무결성 유지 |
작동 원리 | |
핵심 원리 | 각 메모리 영역에 접근 권한 부여 권한 없는 접근 시도 감지 및 차단 예외 처리 또는 프로세스 종료 |
활용 사례 | |
주요 활용 | 버퍼 오버플로 공격 방지 권한 상승 공격 방지 멀티 프로세스 간 메모리 보호 |
장점 및 단점 | |
장점 | 보안 강화 시스템 안정성 향상 멀티태스킹 효율성 증대 |
단점 | 성능 오버헤드 발생 가능 구현 복잡성 증가 메모리 관리 복잡성 증가 |
2. 구동 방식
메모리 보호를 수행하는 데에는 여러 방법이 있다.
- 세그먼트 방식: 세그먼트 방식은 컴퓨터 메모리를 여러 개의 크기가 다른 작은 조각(세그먼트)으로 나누어 프로세스에 할당하고, 다른 세그먼트에 대한 접근은 제한하는 방식이다. x86 아키텍처는 이 아키텍처에서 보호된 메모리를 사용하는 데 유용한 몇 가지 세그먼트 기능을 가지고 있다.[21] 세그먼트 방식에서는 프로세스가 세그먼트라고 불리는 메모리 덩어리를 몇 개 할당받아 동작하며, 그 외의 메모리에는 접근할 수 없다. 세그먼트는 하드웨어의 레지스터에 의해 정의되며, 접근 가능한 메모리 주소의 범위를 제한한다. 허용된 범위 밖으로 데이터를 읽거나 쓰려고 하면 예외가 발생한다.
- 페이징: 페이징에서 메모리 주소 공간은 동일한 작은 크기의 페이지들로 나뉜다. 가상 메모리 구조를 사용하여 각 페이지를 물리 메모리의 임의의 위치에 있게 하거나 보호 처리되도록 플래그를 지정할 수 있다. 가상 메모리는 선형 가상 메모리 주소 공간을 가지게 하고 물리 메모리 주소 공간 위의 블록에 접근하도록 도와준다. x86 아키텍처 등 페이지 기반의 수많은 컴퓨터 아키텍처는 메모리 보호를 위한 페이지를 사용하고 있다. 이러한 설계로 응용 프로그램은 할당되지 않은 페이지에는 접근하지 못한다. 응용 프로그램이 사용하기로 결정한 임의의 메모리 주소가 할당된 페이지를 가리키거나 페이지 실패 (PF) 오류를 만들기 때문이다.
- 보호키: 보호키는 물리 메모리를 특정 크기(예: 2KB)의 블록으로 나누고, 각 블록에 보호키라는 숫자 값을 연결하는 구조이다. 각 프로세스에도 보호키 값이 연결된다. 메모리 접근 시 하드웨어는 현재 프로세스의 보호키가 접근하려는 메모리 블록의 보호키와 일치하는지 검사한다. 일치하지 않으면 예외가 발생한다. 이 구조는 시스템/360 아키텍처에 사용되었으며,[3] 오늘날 System z 메인프레임과 System z 운영 체제 및 해당 하위 시스템에서 널리 사용된다.
- 시뮬레이트되는 세그먼트 방식: 모니터링 컴퓨터 프로그램을 이용하여 일부 컴퓨터의 기계어를 해석하는 것을 시뮬레이션이라고 한다. 이러한 명령 집합 시뮬레이터는 세그먼트 방식과 비슷한 구조를 사용하고 실행 전에 실시간으로 각 명령의 길이와 대상 주소의 무결성을 확인함으로써 메모리 보호를 제공할 수 있다.[1] 시뮬레이터는 대상 주소와 길이를 계산하여 동적 메모리 블록과 같은 스레드 환경과 관련한 유효한 주소 범위 목록과 비교한다.[1] CPU에 적절한 기능이 있는 경우, 이 메모리 보호 방법을 사용하는 것은 일반적으로 권장되지 않는데, 이는 컴퓨터에서 귀중한 처리 능력을 빼앗기 때문이다. 그러나 일반적으로 디버깅 및 테스트 목적으로 사용되어 다른 일반적인 저장소 위반에 대해 매우 세밀한 수준의 세분성을 제공하며, 보호되지 않은 저장소와 동일한 저장 키를 가질 수 있는 특정 저장소 섹션을 덮어쓰려고 시도하는 명령을 정확하게 나타낼 수 있다.
- 성능 기반 번지 지정: 성능 기반 번지 지정은 메모리 보호를 위한 흥미로운 구조이지만 현대의 컴퓨터에 쓰이지 않는다. 이 구조에서 포인터는 커널을 통해 실행할 수 있는 권한이 있는 명령어 사용을 통해서만 만들 수 있는 보호된 객체로 치환된다.[15] 역량 기반 주소 지정은 현대 상업용 컴퓨터에서는 사용되지 않는 메모리 보호 방법이다.
- 동적 테인팅: 동적 테인팅은 프로그램이 실행될 때 메모리가 할당되면, 같은 표시(테인트 마크)를 사용해서 메모리와 포인터 모두에 표시를 하는 기술이다. 이 표시(테인트 마크)는 프로그램이 실행되는 동안 계속 전달되며, 포인터 'p'를 통해 메모리 주소 'm'에 접근할 때마다 확인된다. 만약 'm'과 'p'의 표시가 서로 다르면, 프로그램 실행이 중단되고 잘못된 접근이 있었다고 보고된다.[7][8]
2. 1. 세그먼트 방식
세그먼트 방식은 컴퓨터 메모리를 여러 개의 크기가 다른 작은 조각(이하 세그먼트)으로 나누어 프로세스에 할당하고, 다른 세그먼트에 대한 접근은 제한하는 방식이다. x86 아키텍처는 몇 가지 세그먼트 기능들을 가지고 있는데, 이러한 기능들은 이 아키텍처에서 보호된 메모리를 사용하고자 하는 사람들에게 유용하다.[21] x86 아키텍처에서 전역 서술자 테이블과 지역 서술자 테이블은 컴퓨터 메모리의 세그먼트를 참조하는 데에 사용할 수 있다. 또, x86 프로세서에서 메모리 세그먼트에 대한 포인터는 프로세서의 세그먼트 레지스터에 저장할 수 있다. 초기에 x86 프로세서는 CS(코드 세그먼트), SS(스택 세그먼트), DS(데이터 세그먼트), ES(추가 세그먼트)의 4개 세그먼트 레지스터를 가졌으며, 나중에 FS, GS라는 두 개의 세그먼트 레지스터가 추가되었다.[21]세그멘테이션은 컴퓨터의 메모리를 세그먼트로 나누는 것을 의미한다. 메모리 위치를 참조할 때는 세그먼트를 식별하는 값과 해당 세그먼트 내의 오프셋을 포함한다. 세그먼트 디스크립터는 읽기 전용, 특정 보호 링에서만 허용하는 등 접근 권한을 제한할 수 있다.
세그먼트 방식에서는 프로세스가 세그먼트라고 불리는 메모리 덩어리를 몇 개 할당받아 동작하며, 그 외의 메모리에는 접근할 수 없다. 세그먼트는 하드웨어의 레지스터에 의해 정의되며, 접근 가능한 메모리 주소의 범위를 제한한다. 허용된 범위 밖으로 데이터를 읽거나 쓰려고 할 때 예외가 발생한다.
2. 2. 페이징
페이징에서 메모리 주소 공간은 동일한 작은 크기의 페이지들로 나뉜다. 가상 메모리 구조를 사용하여 각 페이지를 물리 메모리의 임의의 위치에 있게 하거나 보호 처리되도록 플래그를 지정할 수 있다. 가상 메모리는 선형 가상 메모리 주소 공간을 가지게 하고 물리 메모리 주소 공간 위의 블록에 접근하도록 도와준다.x86 아키텍처 등 페이지 기반의 수많은 컴퓨터 아키텍처는 메모리 보호를 위한 페이지를 사용하고 있다.
페이지 테이블은 가상 메모리를 물리 메모리에 매핑하는 데 사용하며, 일반적으로 프로세스는 이러한 페이지 테이블의 존재 여부를 알지 못한다. 페이지 테이블은 새로운 메모리 할당을 쉽게 하고, 새로운 각 페이지는 물리 메모리의 어느 곳에서라도 할당될 수 있다.
이러한 설계로 응용 프로그램은 할당되지 않은 페이지에는 접근하지 못한다. 응용 프로그램이 사용하기로 결정한 임의의 메모리 주소가 할당된 페이지를 가리키거나 페이지 실패 (PF) 오류를 만들기 때문이다.
페이지 실패는 메모리 보호뿐만 아니라, 운영 체제가 페이지 실패를 가로채 전에 디스크에 스왑해 둔 페이지를 불러와 페이지 실패를 일으킨 응용 프로그램으로 복귀할 수 있게 하는 등 다른 방법으로도 쓰인다. 이에 따라 응용 프로그램은 필요하면 메모리 페이지를 받는다.
스왑 구조는 사용하고 있지 않은 메모리 안의 데이터가 디스크 기억 장치로 이동하거나 그 데이터를 디스크 기억 장치에서 가져오게 할 수 있다. 이는 응용 프로그램에게는 보이지 않는 방식이며 전반적인 메모리 용량을 늘려 준다.[2]
2. 3. 보호키
보호키(protection key)는 물리 메모리를 특정 크기(예: 2KB)의 블록으로 나누고, 각 블록에 보호키라는 숫자 값을 연결하는 구조이다. 각 프로세스에도 보호키 값이 연결된다. 메모리 접근 시 하드웨어는 현재 프로세스의 보호키가 접근하려는 메모리 블록의 보호키와 일치하는지 검사한다. 일치하지 않으면 예외가 발생한다. 이 구조는 시스템/360 아키텍처에 사용되었으며,[3] 오늘날 System z 메인프레임과 System z 운영 체제 및 해당 하위 시스템에서 널리 사용된다.System/360 보호 키는 물리 주소와 연결되지만, 휴렛 팩커드/인텔 IA-64 및 휴렛 팩커드 PA-RISC 아키텍처의 보호 키 메커니즘은 가상 주소와 연결되어 프로세스당 여러 개의 키를 허용한다.
Itanium 및 PA-RISC 아키텍처에서 변환(TLB 항목)에는 '키'(Itanium) 또는 '액세스 ID'(PA-RISC)가 연결된다. 실행 중인 프로세스에는 여러 개의 보호 키 레지스터가 있다(Itanium은 16개,[4] PA-RISC는 4개[5]). 가상 주소로 선택된 변환은 해당 키를 각 보호 키 레지스터와 비교한다. 이 중 하나라도 일치하면(다른 검사 포함) 액세스가 허용되고, 일치하는 항목이 없으면 오류 또는 예외가 발생한다.
PA-RISC는 15~18비트, Itanium은 최소 18비트의 키를 요구한다. 키는 주로 라이브러리, 모듈 등 '보호 도메인'과 연결된다.
x86 보호 키[6] 아키텍처는 사용자 페이지의 가상 주소에 16개 보호 키 중 하나를 태깅할 수 있다. 동일한 보호 키로 태깅된 모든 페이지는 보호 도메인을 구성한다. 새로운 레지스터에는 각 보호 도메인 관련 권한이 포함되며, 로드 및 저장 작업은 페이지 테이블 권한과 가상 주소의 보호 도메인 관련 보호 키 권한을 모두 확인한다.
2. 4. 시뮬레이트되는 세그먼트 방식
모니터링 컴퓨터 프로그램을 이용하여 일부 컴퓨터의 기계어를 해석하는 것을 시뮬레이션이라고 한다. 이러한 명령 집합 시뮬레이터는 세그먼트 방식과 비슷한 구조를 사용하고 실행 전에 실시간으로 각 명령의 길이와 대상 주소의 무결성을 확인함으로써 메모리 보호를 제공할 수 있다.[1] 시뮬레이터는 대상 주소와 길이를 계산하여 동적 메모리 블록과 같은 스레드 환경과 관련한 유효한 주소 범위 목록과 비교해야 한다.[1] "유효한"의 뜻은 환경에 따른 스레드의 수명을 통해 바뀔 수 있다.[1] 이는 현재의 실행 모드(storage key냐 supervisor 상태이냐)에 따라 정적 블록의 기억을 바꾸는 것을 허용할 수 있고 허용하지 않을 수도 있다.[1]CPU에 적절한 기능이 있는 경우, 이 메모리 보호 방법을 사용하는 것은 일반적으로 권장되지 않는데, 이는 컴퓨터에서 귀중한 처리 능력을 빼앗기 때문이다. 그러나 일반적으로 디버깅 및 테스트 목적으로 사용되어 다른 일반적인 저장소 위반에 대해 매우 세밀한 수준의 세분성을 제공하며, 보호되지 않은 저장소와 동일한 저장 키를 가질 수 있는 특정 저장소 섹션을 덮어쓰려고 시도하는 명령을 정확하게 나타낼 수 있다.
2. 5. 성능 기반 번지 지정
성능 기반 번지 지정은 메모리 보호를 위한 흥미로운 구조이지만 현대의 컴퓨터에 쓰이지 않는다. 이 구조에서 포인터는 커널을 통해 실행할 수 있는 권한이 있는 명령어 사용을 통해서만 만들 수 있는 보호된 객체로 치환된다.[15]역량 기반 주소 지정은 현대 상업용 컴퓨터에서는 사용되지 않는 메모리 보호 방법이다. 이 방법에서 포인터는 커널 또는 권한을 위임받은 다른 프로세스만 실행할 수 있는 권한 있는 명령어를 사용하여 생성할 수 있는 보호된 객체(''역량''이라고 함)로 대체된다. 이는 커널이 별도의 주소 공간이나 컨텍스트 전환을 사용할 필요 없이 어떤 프로세스가 메모리의 어떤 객체에 접근할 수 있는지 효과적으로 제어할 수 있게 해준다. 역량 기반 보안을 사용한 상업용 제품은 Plessey System 250, IBM System/38, 인텔 iAPX 432 아키텍처, KeyKOS 등이 있다. 역량 방식은 EROS 및 Combex DARPA 브라우저와 같은 연구 시스템에서 널리 사용된다. 개념적으로는 일부 가상 머신, 특히 스몰토크와 자바의 기반으로 사용된다. 현재 캠브리지 대학교의 DARPA 자금 지원을 받는 CHERI 프로젝트는 레거시 소프트웨어도 지원하는 현대적인 역량 기반 머신을 개발하기 위해 노력하고 있다.[15]
2. 6. 동적 테인팅
동적 테인팅은 프로그램이 실행될 때 메모리가 할당되면, 같은 표시(테인트 마크)를 사용해서 메모리와 포인터 모두에 표시를 하는 기술이다. 이 표시(테인트 마크)는 프로그램이 실행되는 동안 계속 전달되며, 포인터 'p'를 통해 메모리 주소 'm'에 접근할 때마다 확인된다. 만약 'm'과 'p'의 표시(테인트 마크)가 서로 다르면, 프로그램 실행이 중단되고 잘못된 접근이 있었다고 보고된다.[7][8]SPARC M7 프로세서부터는 하드웨어에서 동적 테인팅을 구현한다. 오라클은 이 기능을 실리콘 보안 메모리(SSM)(이전에는 Application Data Integrity(ADI)로 불림)로 판매한다.[9]
lowRISC CPU 설계는 Tagged Memory라는 이름으로 동적 테인팅을 포함한다.[10]
3. 측정
특정 구현의 보호 수준은 해당 구현이 최소 권한의 원칙을 얼마나 잘 준수하는지에 따라 측정될 수 있다.[11] 보호 수준을 알아보는 유용한 방법은 얼마나 최소 권한의 원칙을 고수하는지를 측정하는 것이다.[22]
4. 다른 운영 체제의 메모리 보호
CP/M과 다양한 종류의 MS-DOS 등 메모리 보호를 사용하지 않는 운영 체제는 거의 없다. 초기 버전의 마이크로소프트 윈도우는 도스 위에 메모리 보호 기능을 추가하였다.
메모리 보호를 사용하는 운영 체제는 다음과 같다:
- 마이크로소프트 윈도우 계열
- 솔라리스, 리눅스, BSD, 맥 OS X 등 대부분의 유닉스 계통 운영 체제 (초기 맥 운영 체제는 제한된 메모리 보호를 사용하였다)
다양한 운영 체제는 다양한 형태의 메모리 보호 또는 분리를 사용한다. 메모리 보호는 1960년대부터 대부분의 메인프레임과 많은 미니컴퓨터 시스템에서 일반적이었지만, 진정한 메모리 분리는 1987년에 OS/2와 RISC OS가 출시될 때까지 홈 컴퓨터 운영 체제에서 사용되지 않았다. 이전 시스템에서는 이러한 보호 기능이 없는 것을 이용하여 프로세스 간에 포인터를 주고받는 프로세스 간 통신을 하기도 했다. Windows 9x 운영 체제 제품군에서는 프로세스가 시스템 메모리에 접근할 수 있다.[12]
메모리 보호를 구현하는 일부 운영 체제는 다음과 같다.
- 유닉스 계열 시스템 (1970년대 후반부터): 솔라리스, 리눅스, BSD, macOS, iOS, GNU Hurd
- 벨 연구소에서 유닉스의 후속으로 제작된 Plan 9 및 Inferno (1992, 1995)
- OS/2 (1987)
- RISC OS (1987) (OS 메모리 보호는 포괄적이지 않다.)
- Microware OS-9 (1992년 이후, 선택적 모듈)
- Windows NT 3.1부터의 마이크로소프트 윈도우 제품군 (1993)
- Atari MultiTOS (1991년 이후)
- Pharos[13] (2017년 이후)
유닉스 계열 시스템에서 `mprotect` 시스템 호출은 메모리 보호를 제어하는 데 사용된다.[14]
참조
[1]
서적
Intel 64 and IA-32 Architectures Software Developer's Manuals: Volume 3A: System Programming Guide, Part 1
https://www.intel.co[...]
Intel
2008-07
[2]
논문
Sharing and Protection in a Single Address Space Operating System
https://homes.cs.was[...]
[3]
뉴스
Memory protection keys
https://lwn.net/Arti[...]
2015-05-13
[4]
웹사이트
Keys in Itanium
https://download.int[...]
[5]
웹사이트
Memory protection in HP PA-RISC
https://web.archive.[...]
2018-10-29
[6]
웹사이트
Intel Software Developer Manual
https://web.archive.[...]
2018-10-29
[7]
서적
Proceedings of the twenty-second IEEE/ACM international conference on Automated software engineering
http://www.cc.gatech[...]
[8]
간행물
Effective and Efficient Memory Protection Using Dynamic Tainting
https://www.cc.gatec[...]
[9]
웹사이트
Oracle Announces Breakthrough Processor and Systems Design with SPARC M7
https://www.oracle.c[...]
2016-11-18
[10]
웹사이트
Tagged memory support
http://www.lowrisc.o[...]
2018-05-24
[11]
문서
Measuring memory protection
http://portal.acm.or[...]
1978-05
[12]
웹사이트
Windows 9x does not have true memory protection
http://everything2.c[...]
Everything2
2009-04-29
[13]
웹사이트
Pharos
https://sourceforge.[...]
2020-12-16
[14]
웹사이트
mprotect
http://pubs.opengrou[...]
The Open Group
[15]
문서
Measuring memory protection
http://portal.acm.or[...]
1978-05
[16]
서적
Intel 64 and IA-32 Architectures Software Developer's Manuals: Volume 3A: System Programming Guide, Part 1
http://www.intel.com[...]
Intel
2008-08-21
[17]
문서
Keys in Itanium
http://download.inte[...]
[18]
문서
Memory protection in HP PA-RISC
http://h21007.www2.h[...]
[19]
웹사이트
Windows 9x does not have true memory protection
http://everything2.c[...]
Everything2
2009-04-29
[20]
웹사이트
mprotect
http://pubs.opengrou[...]
The Open Group
2012-10-08
[21]
문서
http://www.intel.com[...]
[22]
문서
Measuring memory protection
http://portal.acm.or[...]
1978-05
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com